'use strict';
const Readable = require('stream').Readable;

class ToReadable extends Readable {
    
    constructor ( iterator) {
        //  调用父类构造函数
        super();
        //  添加迭代器为自己的属性
        this.iterator = iterator;
    }

    //  子类需要实现该方法
    //  这是生产数据的逻辑
    _read () {
        const res = this.iterator.next();
        if ( res.done) {
            //  数据源已枯竭，调用`push(null)`通知流
            return this.push( null);
        }
        setTimeout( () => {
            //  通过`push`方法将数据添加到流中
            this.push( `${res.value} \n`);
        }, 0);
    }
}

//  创建迭代器
const iterator = (limit => {
    return {
        next () {
            if ( limit--){
                return { done: false, value: limit + Math.random()}
            }
            return { done: true}
        }
    }
})( 1000);

const readable = new ToReadable( iterator);

//  监听`data`事件，一次获取一个数据
readable.on( 'data', data => process.stdout.write(data));
//  所有数据均已读完
readable.on( 'end', () => process.stdout.write('done'));